#include <stdio.h>

// 查找某个节点的根节点（使用路径压缩来优化查找）
int find(int x, int parent[]) {
    if (parent[x] != x) {
        // 递归查找父节点并压缩路径
        parent[x] = find(parent[x], parent);
    }
    return parent[x];
}

int main() {
    int n, m;

    // 输入 n 和 m，表示人数和消息数
    if (scanf("%d %d", &n, &m) != 2) {
        // 输入读取错误
        printf("Null\n");
        return 0;
    }

    // 检查人数和消息数的合法性
    if (n < 1 || n >= 100000 || m < 1 || m >= 100000) {
        // 如果超出规定范围，输出 "Null"
        printf("Null\n");
        return 0;
    }

    // 初始化并查集数组，每个人初始为自己的团队
    int parent[n + 1];
    for (int i = 1; i <= n; i++) {
        parent[i] = i; // 初始时，每个人的父节点是自己
    }

    // 处理每条消息
    for (int i = 0; i < m; i++) {
        int a, b, c;

        // 读取消息 a, b, c
        if (scanf("%d %d %d", &a, &b, &c) != 3) {
            // 如果输入格式有误，忽略本条消息
            continue;
        }

        // 检查 a 和 b 是否在合法范围内
        if (a < 1 || a > n || b < 1 || b > n) {
            printf("da pian zi\n"); // 输入不合法，输出 "da pian zi"
            continue;
        }

        // 处理指令
        if (c == 0) {
            // 指令为 0，表示将 a 和 b 合并到同一个团队中
            int rootA = find(a, parent); // 查找 a 的根节点
            int rootB = find(b, parent); // 查找 b 的根节点

            // 如果 a 和 b 不在同一个团队，合并它们
            if (rootA != rootB) {
                parent[rootB] = rootA; // 将 b 的根节点指向 a 的根节点
            }
        } else if (c == 1) {
            // 指令为 1，表示判断 a 和 b 是否在同一个团队
            if (find(a, parent) == find(b, parent)) {
                printf("We are a team\n"); // a 和 b 在同一个团队
            } else {
                printf("We are not a team\n"); // a 和 b 不在同一个团队
            }
        } else {
            // 其他不合法的指令
            printf("da pian zi\n");
        }
    }

    return 0;
}
